#pragma once

#include <iostream>
#include <string>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void Daemon(const std::string& newProWoPath = "")
{
    // 1. 忽略信号 -- 对方连接关闭 -- 代码中处理了，也可以不设置
    signal(SIGPIPE, SIG_IGN);
    // 2. 设置新的进程工作路径
    if (newProWoPath.empty() == false)
    {
        chdir(newProWoPath.c_str());
    }
    // 3. 创建新的会话 -- 话首是服务器进程 -- setsid：设置会话的进程不能是进程组组长
    int id = fork();
    if (id == 0) setsid();
    else exit(0);
    // 4. 将IO和错误流重定向至/dev/null文件中(数据黑洞)
    int fd = open("/dev/null", O_RDWR);
    if (fd > 0)
    {
        dup2(fd, STDIN_FILENO);
        dup2(fd, STDOUT_FILENO);
        dup2(fd, STDERR_FILENO);
    }
    close(fd);
}
